package com.jdbc;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射案例
 */
public class ReflectDemo {

    public static void main(String[] args) {
        try {
            // 1.获取Class对象
            Class clazz = Student.class;
            // 2.创建对象
            Student student = (Student) clazz.newInstance();
            System.out.println(student);
            // 3.获得所有方法
            Method[] methods = clazz.getDeclaredMethods();
            for(Method method : methods){
                System.out.println(method);
            }
            // 4.获得特定的方法 参数1 方法名 参数2 方法的参数类型
            Method method = clazz.getDeclaredMethod("setName",String.class);
            // 5.调用方法 对象.方法(参数) ---> 方法名.invoke(对象,参数)
            method.invoke(student,"张三");
            System.out.println(student);
            // 6.获得所有的属性
            Field[] fields = clazz.getDeclaredFields();
            for(Field field : fields){
                System.out.println(field.getType() + " " + field.getName());
            }
            // 7.获得特定的属性
            Field field = clazz.getDeclaredField("age");
            // 8.设置属性的可访问性
            field.setAccessible(true);
            // 9.调用属性的set方法 对象.属性名 = xxx
            field.set(student,18);
            System.out.println(student);
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
